package Views;

import Controllers.*;
import Models.*;
import Models.Customer;
import Views.TableModels.*;
import java.awt.event.WindowListener;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionListener;

public abstract class ViewAbstract<T extends DB.RowInterface>
		extends javax.swing.JPanel implements ListSelectionListener, WindowListener
{
	/**
	 * Controlleren der skal bruges i viewet
	 */
	protected ControllerInterface<T> controller;

	/**
	 * Den variabel der holder et redigerbart objekt, åbnet fra søgning
	 */
	protected T chosenOne = null;

	/**
	 * Den variabel der holder et nyoprettet/ikke gemt objekt
	 */
	protected T newOne = null;

	/**
	 * Fortæller om det åbne/nye objekt er igang med at blive redigeret og ikke er gemt
	 */
	protected boolean isUnsaved = false;

	/**
	 * Reference til den tabbedpane, alle views er en del af
	 */
	protected SearchableTabbedPane tabbedPane;

	/**
	 * Variabel der kan holde alle slags pickere
	 */
	protected Picker<? extends DB.RowInterface> picker;

	/**
	 * Ændre tekstbokse og knappers enabled state
	 * @param state True/False
	 */
	protected abstract void changeComponentState(boolean state);

	/**
	 * Fylder tekstboxene med data fra det valgte objekt
	 */
	protected abstract void populateFields();

	/**
	 * Fjerner alt tekst fra tekstboxene
	 */
	protected abstract void clearComponents();

	/**
	 * Viser det unikke nummer på det valgte objekt
	 * @param no Det unikke nummer
	 */
	protected abstract void showNo(int no);

	/**
	 * Henter objektet med det givne nummer, og advarer om eventuel overskrivelse
	 * @param no Objektets unikke nummer
	 */
	protected void openWithNo(int no)
	{
		if(isUnsaved == true)
		{
			int answer = JOptionPane.showConfirmDialog(this, "Der er data der ikke gemt. Hvis du vælger at fortsætte, mistes disse.", "Vil du gemme?", JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
			if(answer != 0) //Ikke OK
			{
				return;
			}
		}
		showNo(no);
	}

	/**
	 * Henter det objekt der er åbnet eller det der er oprettet
	 * @return Det objekt der er åbnet eller det der er oprettet
	 */
	protected T getTheOne()
	{
		T theOne;

		if(chosenOne == null)
		{
			theOne = newOne;
		}
		else
		{
			theOne = chosenOne;
		}

		return theOne;
	}

	/**
	 * Setter status for om et objekt er gemt
	 * @param state True/False
	 */
	protected void setUnsavedState(boolean state)
	{
		isUnsaved = state;
	}

	/**
	 * Viser en confirmations boks når der skiftes tab uden at have gemt
	 * @return True/False
	 */
	protected boolean confirmTabChange()
	{
		if(isUnsaved)
		{
			if(0 == JOptionPane.showConfirmDialog(this, "Er du sikker på at du vil skifte væk fra dette faneblad? Ikke gemte informationer vil gå tabt.", "Er du sikker?", JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE))
			{
				clearComponents();
				changeComponentState(false);
				return true;
			}
			else
			{
				return false;
			}
		}
		else
		{
			return true;
		}
	}

	/**
	 * Viser en confirmations boks når der slettes
	 * @param type Hvilken type objekt der skal slettes
	 * @return true, hvis brugeren bekræfter sletningen, ellers false
	 */
	protected boolean confirmDeletion(String type)
	{
		if(0 == JOptionPane.showConfirmDialog(this, "Er du sikker på at du vil slette "+type+"?", "Er du sikker?", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE))
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	/**
	 * Viser en besked om at der er tomme felter
	 */
	protected void informAboutEmptyFields()
	{
		JOptionPane.showMessageDialog(this, "Et eller flere af felterne er tomme.", "Manglende information", JOptionPane.ERROR_MESSAGE);
	}

	/**
	 * Viser en besked om at der er forkert input
	 * @param message Beskedens beskrivelse
	 * @param title Beskedens titel
	 */
	protected void informAboutWrongInput(String message, String title)
	{
		JOptionPane.showMessageDialog(this, message, title, JOptionPane.ERROR_MESSAGE);
	}

	/**
	 * Informerer brugeren om at objektet blev gemt korrekt
	 * @param type Hvilken type objekt der blev gemt
	 */
	protected void informSavingWentOk(String type)
	{
		JOptionPane.showMessageDialog(this, type+" er gemt.", "Arkiveret", JOptionPane.INFORMATION_MESSAGE);
	}

	/**
	 * Opretter Picker til det givne view
	 * @param tab Det givne view (null for Checkpoint)
	 * @return Ny instans af PickerAbstract
	 */
	protected Picker createPicker(TabIndex tab)
	{
		Picker thePicker = null;

		switch(tab)
		{
			case Customers:
				thePicker = new Picker<Customer>(new CustomerController(), new CustomerTableModel());
				break;
			case Locations:
				thePicker = new Picker<Location>(new LocationController(), new LocationTableModel());
				break;
			case Routes:
				thePicker = new Picker<Route>(new RouteController(), new RouteTableModel());
				break;
			case Rounds:
				thePicker = new Picker<Round>(new RoundController(), new RoundTableModel());
				break;
			case Employees:
				thePicker = new Picker<Employee>(new EmployeeController(), new EmployeeTableModel());
				break;
			case Cars:
				thePicker = new Picker<Car>(new CarController(), new CarTableModel());
				break;
			case Schedules:
				thePicker = new Picker<Schedule>(new ScheduleController(), new ScheduleTableModel());
				break;
			default:
				thePicker = new Picker<Checkpoint>(new CheckpointController(), new CheckpointTableModel());
		}
		
		return thePicker;
	}

	/**
	 * Frigiver pickeren
	 */
	protected void releasePicker()
	{
		this.picker.dispose();
		this.picker = null;
	}

	public void windowOpened(java.awt.event.WindowEvent e) {}
	public void windowClosed(java.awt.event.WindowEvent e) {}
	public void windowIconified(java.awt.event.WindowEvent e) {}
	public void windowDeiconified(java.awt.event.WindowEvent e) {}
	public void windowActivated(java.awt.event.WindowEvent e) {}
	public void windowDeactivated(java.awt.event.WindowEvent e) {}
}
